package cn.kgc.reflect;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author: mosin
 * @version: v1.0  2022/10/20
 * 通过反射操作类对象中的方法
 *   1.获取方法
 *   2.调用方法
 *   Method
 */
public class ReflectDemo05 {

    public static void main(String[] args) {

        try {

            Class  clazz = Class.forName("cn.kgc.reflect.User");
            System.out.println("-------------getMethods()----------------");
            // 获取类中方法  本类以及父类中被public修饰的方法
            Method[] methods = clazz.getMethods();
            for (Method method : methods) {
                System.out.println("method = " + method);
            }

            System.out.println("-------------getDeclaredMethods()----------------");
            // 获取本类中已声明的方法 public  private
            Method[] declaredMethods = clazz.getDeclaredMethods();
            for (Method declaredMethod : declaredMethods) {
                System.out.println("declaredMethod = " + declaredMethod);
            }

            System.out.println("-------------getMethod(String methodName)----------------");
            Method getAgeMethod = clazz.getMethod("getAge");
            System.out.println("getAgeMethod = " + getAgeMethod);
            System.out.println("-------------getMethod(String methodName,Class ...paramType)----------------");
            Method setAgeMethod = clazz.getMethod("setAge", Integer.class);
            System.out.println("setAgeMethod = " + setAgeMethod);

            System.out.println("--------------------getDeclaredMethod()--------------------------");
            Method testMethod = clazz.getDeclaredMethod("testMethod");
            System.out.println("testMethod = " + testMethod);

            Method setAge = clazz.getDeclaredMethod("setAge", Integer.class);
            System.out.println("setAge = " + setAge);

            // 操作方法  调用  参数传递  参数1  调用哪个对象的方法
            System.out.println("-------------反射调用方法---------------");
            Object o = clazz.newInstance();
            System.out.println("o = " + o);
            setAge.invoke(o, 30);
            System.out.println("o = " + o);

            System.out.println("-------------反射调用私有方法---------------");
            // 私有方法的调用   提升操作权限
            testMethod.setAccessible(true);
            testMethod.invoke(o);



        } catch (Exception e) {
            e.printStackTrace();
        }
    }





}
